"""
23、(app)综合移动应用自动化测试设计【30分】请使用 pytest框架编写一个自动化测试脚本，
以验证移动应用的多种功能。要求使用MobileBy进行元素定位，并运用TouchAction 方法进行坐标定位。以下是具体要求:
测试元素:
登录页面
元素 NAME:com.example:id/login_username_field(登录用户名输入框)
元素 XPATH:com.example:id/login_password_field(录密码输入框)
元素XPATN : com.example:id/login_button(登录按钮)
元素ID:com.example:id/welcome_user(欢迎用户消息框)
欢迎页面
元素ID :com.example:id/welcome_title(确认欢迎标题是否可见)
元素ID name:com.example:id/start_button(开始按钮)
注册页面
元案ID name:com.example:id/username_feld(用户名输入框)
元素ID name:com.example:id/password_feld(密码输入框)
兀案ID:com.examp'e:id/confirm_password field(确认密码输入框)
元案XPATN: com.example:id/success_message(注册成功消息框)
元素ID:com.example:id/register_button(注册按钮)
退出登录
元案id: com.example:id/back_to_login
主页
元素XPATH:com.example:id/settings button(设置按钮)
元素XPATN:: com.example:id/settings_title(设置页面标题，确认页面是否打开)


测试用例:
打开应用并确认“欢迎页面”是否显示。上
点击“开始”按钮进入注册页面。上
在注册页面填写信息并提交:
生成一个随机用户名，使用 MobileBy 定位并输入。
输入并确认密码。
提交注册并确认成功消息是否显示。
返回并进入登录页面，输入注册的用户名和密码，登录并确认欢迎消息是否显示。
在主页上使用TouchAction点击特定坐标(例如:设置按钮的坐标 x=150,y=400)，并验证设置页面是否打开。

"""
import pytest
import random
import string
from appium import webdriver
from appium.webdriver.common.mobileby import MobileBy
from appium.webdriver.common.touch_action import TouchAction

# 测试数据配置
CAPS = {
    "platformName": "Android",
    "deviceName": "Android Emulator",
    "appPackage": "com.example",
    "appActivity": ".MainActivity",
    "automationName": "UiAutomator2"
}

# 测试坐标（根据实际屏幕分辨率调整）
SETTINGS_COORDINATE = (150, 400)


class TestMobileApp:
    @pytest.fixture(scope="aaa", autouse=True)
    def driver(self):
        """初始化并返回Appium驱动"""
        driver = webdriver.Remote('http://localhost:4723/wd/hub', CAPS)
        yield driver
        driver.quit()

    def test_01_welcome_page(self, driver):
        """测试用例1：验证欢迎页面"""
        # 确认欢迎标题可见
        welcome_title = driver.find_element(MobileBy.ID, "com.example:id/welcome_title")
        assert welcome_title.is_displayed(), "欢迎标题未显示"

    def test_02_navigate_to_register(self, driver):
        """测试用例2：导航到注册页面"""
        # 点击开始按钮
        start_btn = driver.find_element(MobileBy.ID, "com.example:id/start_button")
        start_btn.click()

        # 验证注册页面加载
        assert "注册" in driver.page_source, "未成功导航到注册页面"

    def test_03_register_user(self, driver):
        """测试用例3：用户注册"""
        # 生成随机用户名（8位字母数字组合）
        username = ''.join(random.choices(string.ascii_letters + string.digits, k=8))
        password = "Test@123"

        # 定位元素并输入信息
        driver.find_element(MobileBy.NAME, "com.example:id/username_field").send_keys(username)
        driver.find_element(MobileBy.NAME, "com.example:id/password_field").send_keys(password)
        driver.find_element(MobileBy.ID, "com.example:id/confirm_password_field").send_keys(password)

        # 提交注册
        driver.find_element(MobileBy.ID, "com.example:id/register_button").click()

        # 验证注册成功消息
        success_msg = driver.find_element(MobileBy.XPATH, "com.example:id/success_message")
        assert success_msg.is_displayed(), "注册成功消息未显示"

    def test_04_login_user(self, driver):
        """测试用例4：用户登录"""
        # 返回登录页面（根据实际页面结构调整）
        driver.back()

        # 输入注册信息
        driver.find_element(MobileBy.NAME, "com.example:id/login_username_field").send_keys("testuser")
        driver.find_element(MobileBy.XPATH, "com.example:id/login_password_field").send_keys("Test@123")

        # 点击登录按钮
        driver.find_element(MobileBy.XPATN, "com.example:id/login_button").click()  # 注意：XPATN可能是拼写错误，应为XPATH

        # 验证欢迎消息
        welcome_msg = driver.find_element(MobileBy.ID, "com.example:id/welcome_user")
        assert "欢迎" in welcome_msg.text, "登录欢迎消息验证失败"

    def test_05_touch_action(self, driver):
        """测试用例5：TouchAction坐标操作"""
        # 点击设置按钮（坐标方式）
        TouchAction(driver).tap(x=SETTINGS_COORDINATE[0], y=SETTINGS_COORDINATE[1]).perform()

        # 验证设置页面标题
        settings_title = driver.find_element(MobileBy.XPATH, "com.example:id/settings_title")
        assert settings_title.is_displayed(), "设置页面未成功打开"

        # 返回主页（根据实际页面结构调整）
        driver.find_element(MobileBy.ID, "com.example:id/back_to_login").click()


if __name__ == "__main__":
    pytest.main()
